
//modificación del archivo proporcionado para incorporarle un menú 

//se importan las librerias para poder leer los archivos de texto que se encuentran en la carpeta
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Scanner;


public class main{
    

    public static void main(String[] args) throws Exception
    {
                Scanner ingreso = new Scanner(System.in);
                char op = ' ';
                String opcion ="s";
                int implementacion = 1;
                int decision=0;
          while (decision == 0){
		if(args.length == 0)
		{
                    
                            
                          opcion= "8";
                    while (enteroAceptado (opcion,1,6)== false){
            op = ' ';
            //--------------------------------------------------------------------------------
            //Se muestra el menú de inicio
            System.out.println("INICIO DEL PROGRAMA");
            System.out.println("Seleccione la impelentación el tipo de esdtructura:");
            System.out.println("                .:Menu:.                       ");
            System.out.println("1. SIMPLESET");
            System.out.println("2. REDBLACK TREE)");
            System.out.println("3. SPLAY TREE");
            System.out.println("4. HASH TABLE");
            System.out.println("5. TREEMAPSET");
            System.out.println("6. SALIR");
            //--------------------------------------------------------------------------------
            //Se ingresa la opcion escogida por el usuario
            opcion = ingreso.nextLine();
            
            /*Si la opcion ingresada no es correcta se muestra el mensaje de error 
              para que ingrese un número válido*/
            if (enteroAceptado (opcion,1,6)==false){
                System.out.println("¡OPCION INVALIDA, VUELVA A INTENTARLO!");
             
            }
            /*Si el valor es correcto, se convierte en un int para que pueda ya 
              utilizarse para la implementación según el factory*/
            else {
                implementacion = Integer.parseInt(opcion);
            }
        }
    
        if (implementacion == 6){
            System.out.println("GRACIAS POR USAR EL PROGRAMA ");
            decision= 1; 
            break; 
        }
    	
        
			// el primer parametro indica el nombre del archivo con las definiciones de las palabras
			File wordFile = new File("files/words.txt");
			
			// el segundo parametro indica el nombre del archivo que tiene el texto a analizar
			File textFile = new File("files/text.txt");
			
		
			
			
			BufferedReader wordreader;
			BufferedReader textreader;
			
			int verbs=0;
			int nouns=0;
			int adjectives=0;
			int adverbs=0;
			int gerunds=0;
			
			long starttime;
			long endtime;
			
			// Verificar que los dos parámetros que se pasaron sean archivos que existen
			if( wordFile.isFile() && textFile.isFile()) {
				// Leer archivos
				try
				{
					wordreader = new BufferedReader(new FileReader(wordFile));
					textreader = new BufferedReader(new FileReader(textFile));
				}
				catch (Exception ex)
				{
					System.out.println("Error al leer!");
					return;
				}

				// Crear un WordSet para almacenar la lista de palabras
		
			
				WordSet words =  WordSetFactory.generateSet(implementacion);
                   
                                
				
				
				String line = null;
				String[] wordParts;
				
				// leer el archivo que contiene las palabras y cargarlo al WordSet.
				starttime = System.currentTimeMillis();
				line = wordreader.readLine();
				while(line!=null)
				{
					wordParts = line.split("\\.");  
					if(wordParts.length == 2)
					{
						words.add(new Word(wordParts[0].trim(),wordParts[1].trim()));
                                                
					}
					line = wordreader.readLine();
				}
				wordreader.close();
				endtime = System.currentTimeMillis();
				
				System.out.println("Palabras cargadas en " + (endtime-starttime) + " ms.");
				
				// Procesar archivo de texto
				starttime = System.currentTimeMillis();
				line = textreader.readLine();
				String[] textParts;
				Word currentword;
				Word lookupword = new Word();
				
				while(line!=null)
				{
					// Separar todas las palabras en la línea.
					textParts = line.split("[^\\w-]+"); // utilizar de separador cualquier caracter que no sea una letra, número o guión.
					
					// Revisar cada palabra y verificar de que tipo es. 
					for(int i=0;i<textParts.length;i++)
					{
						lookupword.setWord(textParts[i].trim().toLowerCase());
						currentword = words.get(lookupword);
						if(currentword != null)
						{
							if(currentword.getType().equals("v-d") || currentword.getType().equals("v") || currentword.getType().equals("q"))
								verbs++;
							else if(currentword.getType().equals("g") )
								gerunds++;
							else if(currentword.getType().equals("a-s") || currentword.getType().equals("a-c") || currentword.getType().equals("a"))
								adjectives++;
							else if(currentword.getType().equals("e"))
								adverbs++;
							else 
								nouns++;
						}
					}
					
					line = textreader.readLine();
				}
				textreader.close();
				endtime = System.currentTimeMillis();
				System.out.println("Texto analizado en " + (endtime-starttime) + " ms.");
				
				// Presentar estadísticas
				System.out.println("El texto tiene:");
				System.out.println(verbs + " verbos");
				System.out.println(nouns + " sustantivos");
				System.out.println(adjectives + " adjetivos");
				System.out.println(adverbs + " adverbios");
				System.out.println(gerunds + " gerundios");
				
			}
			else
			{
				System.out.println("No encuentro los archivos :'( ");
			}
		}
                
    
		else
		{
			System.out.println("Faltan Parametros.");
		}
                
    }
	}
    
        //METODO DE PROGRAMACION DEFENSIVA
static boolean enteroAceptado (String analizar, int min, int max){
        int caja;
	boolean retorno;
	retorno = false; 
		//este metodo nos ayuda a verificar si el valor ingresado esta en el 
		//rango que deseamos
		
		try{	
            caja = Integer.parseInt(analizar);
				if ((Integer.parseInt(analizar) > (min-1))&&(Integer.parseInt(analizar) < (max+1))) {
					retorno = true; }
				
				//else{
					//System.out.println("ERROR: no se aceptan numeros negativos.");
				}
				
					
            catch(NumberFormatException loquequeramos){
                //System.out.println("ERROR: lo que ingreso no es un numero.");
				retorno = false; 
                }
		return retorno; 
	}
}
